# 等号（=）用来给变量赋值。
#
# 等号（=）运算符左边是一个变量名,等号（=）运算符右边是存储在变量中的值。例如：
counter = 100
miles = 100.0
name = "hehf"

print(counter)
print(miles)
print(name)

# 多个变量赋值
a = b = c = 1
print(a, b, c)

myAge, myName = 18, "hehf"
print(myAge, myName)

# Python3 中有六个标准的数据类型：
# 不可变数据（3 个）：Number（数字）、String（字符串）、Tuple（元组）；
# 可变数据（3 个）：List（列表）、Dictionary（字典）、Set（集合）。
# Number（数字）支持 int、float、bool、complex（复数）。
a, b, c, d = 1, 2.00, True, 4 + 3j
print(type(a), type(b), type(c), type(d))

# isinstance 和 type 的区别在于：type()不会认为子类是一种父类类型。isinstance()会认为子类是一种父类类型。
a = 11
print(isinstance(a, int))
print(isinstance(a, bool))


class A:
    pass


class B(A):
    pass


# 注意：在 Python2 中是没有布尔型的，它用数字 0 表示 False，用 1 表示 True。到 Python3 中，把 True 和 False 定义成关键字了，但它们的值还是 1 和 0，它们可以和数字相加。
print(isinstance(A(), A), type(A()), type(A()) == A)
print(isinstance(B(), A), type(B()), type(B()) == A)

# 使用del语句删除一些对象引用。
vardel = 1
del vardel

# String（字符串）
str = "test"
# Python中的字符串用单引号 ' 或双引号 " 括起来，同时使用反斜杠 \ 转义特殊字符。
# 字符串的截取的语法格式如下：变量[头下标:尾下标]
# 索引值以 0 为开始值，-1 为从末尾的开始位置。
print(str)          # 输出字符串
print(str[0:-1])    # 输出第一个到倒数第二个的所有字符
print(str[0])       # 输出字符串第一个字符
print(str[2:5])     # 输出从第三个开始到第五个的字符
print(str[2:])      # 输出从第三个开始的后的所有字符
print(str * 2)      # 输出字符串两次
print(str + "TEST")  # 连接字符串

# 字符串前面添加一个 r，表示原始字符串
print(r'test\sd')

# List（列表）
# 列表是写在方括号 [] 之间、用逗号分隔开的元素列表。和字符串一样，列表同样可以被索引和截取，列表被截取后返回一个包含所需元素的新列表。
# 1、List写在方括号之间，元素用逗号隔开。
# 2、和字符串一样，list可以被索引和切片。
# 3、List可以使用 + 操作符进行拼接。
# 4、List中的元素是可以改变的。

list = ['abc', 123, 4.00, 'xyz']
tinylist = ['tiny', 'test', 1.02]
print(list)
print(tinylist + list)
print(list[0])
print(list[0:-1])
print(list[0:2])

# Tuple（元组）
# 元组（tuple）与列表类似，不同之处在于元组的元素不能修改。元组写在小括号 () 里，元素之间用逗号隔开。
# 元组中的元素类型也可以不相同：
tuple = ('abcd', 786, 2.23, 'runoob', 70.2)
tinytuple = (123, 'runoob')

print(tuple)  # 输出完整元组
print(tuple[0])  # 输出元组的第一个元素
print(tuple[1:3])  # 输出从第二个元素开始到第三个元素
print(tuple[2:])  # 输出从第三个元素开始的所有元素
print(tinytuple * 2)  # 输出两次元组
print(tuple + tinytuple)  # 连接元组

tup1 = ()    # 空元组
tup2 = (20,)  # 一个元素，需要在元素后添加逗号
# string、list和tuple都属于sequence（序列）。
# 注意：
#     1、与字符串一样，元组的元素不能修改。
#     2、元组也可以被索引和切片，方法一样。
#     3、注意构造包含0或1个元素的元组的特殊语法规则。
#     4、元组也可以使用+操作符进行拼接。

# Set（集合）
# 集合（set）是由一个或数个形态各异的大小整体组成的，构成集合的事物或对象称作元素或是成员。
# 基本功能是进行成员关系测试和删除重复元素。
# 可以使用大括号 { } 或者 set() 函数创建集合，注意：创建一个空集合必须用 set() 而不是 { }，因为 { } 是用来创建一个空字典。
# 创建格式：parame = {value01,value02,...}# 或者# set(value)
student = {'Tom', 'Jim', 'Mary', 'Tom', 'Jack', 'Rose'}
print(student)  # 输出集合，重复的元素被自动去掉
# 成员测试
if 'Rose' in student:
    print('Rose 在集合中')
else:
    print('Rose 不在集合中')

# set可以进行集合运算
a = set('abracadabra')
b = set('alacazam')

print(a)
print(a - b)  # a 和 b 的差集
print(a | b)  # a 和 b 的并集
print(a & b)  # a 和 b 的交集
print(a ^ b)  # a 和 b 中不同时存在的元素

# Dictionary（字典）
# 列表是有序的对象集合，字典是无序的对象集合。两者之间的区别在于：字典当中的元素是通过键来存取的，而不是通过偏移存取。
# 字典是一种映射类型，字典用"{ }"标识，它是一个无序的键(key) : 值(value)对集合。
dict = {}
dict['one'] = "1 - 菜鸟教程"
dict[2] = "2 - 菜鸟工具"

tinydict = {'name': 'runoob', 'code': 1, 'site': 'www.runoob.com'}

print(dict['one'])  # 输出键为 'one' 的值
print(dict[2])  # 输出键为 2 的值
print(tinydict)  # 输出完整的字典
print(tinydict.keys())  # 输出所有键
print(tinydict.values())  # 输出所有值
# 字典类型也有一些内置的函数，例如clear()、keys()、values()等。
# 注意：
#     1、字典是一种映射类型，它的元素是键值对。
#     2、字典的关键字必须为不可变类型，且不能重复。
#     3、创建空字典使用 { }

# Python数据类型转换
# int(x[, base]) 将x转换为一个整数
# float(x) 将x转换到一个浮点数
# complex(real[, imag]) 创建一个复数
#  str(x) 将对象x转换为字符串
# repr(x) 将对象x转换为表达式字符串
# eval(str) 用来计算在字符串中的有效Python表达式, 并返回一个对象
# tuple(s) 将序列s转换为一个元组
# list(s) 将序列s转换为一个列表
# set(s) 转换为可变集合
# dict(d) 创建一个字典。d必须是一个序列(key, value)元组。
# frozenset(s) 转换为不可变集合
# chr(x) 将一个整数转换为一个字符
# ord(x) 将一个字符转换为它的整数值
# hex(x) 将一个整数转换为一个十六进制字符串
# oct(x) 将一个整数转换为一个八进制字符串
